package main

import (
	"fmt"

	"gitee.com/xdevops/exporters/nginx-exporter/nginx"   // 导入自定义的nginx包，用于Nginx相关的功能
	"gitee.com/xdevops/exporters/nginx-exporter/watcher" // 导入自定义的watcher包，用于文件监控
	"github.com/micro-plat/hydra"
	"github.com/micro-plat/hydra/conf/app"
	"github.com/micro-plat/lib4go/logger"                     // 导入logger包，用于日志记录
	"github.com/prometheus/client_golang/prometheus/promhttp" // 导入Prometheus的HTTP包，用于暴露Prometheus指标
)

func init() {

	//应用配置初始化后，根据配置信息创建NginxCollector实例，注册服务
	exporterApp.OnSetup(func(conf app.IAPPConf) error {

		// 从配置中心获取配置信息
		appConf, err := conf.GetServerConf().GetSubConf("app")
		if err != nil {
			return err
		}

		// 设置Nginx访问日志的文件路径
		logger := logger.New("nginx-exporter")
		logFilePath := appConf.GetString("logfile")
		hosts := appConf.GetStrings("hosts")
		durationHours := appConf.GetInt("duration_hours", 24)
		saveOffset := appConf.GetBool("save_offset", false)
		enableRequestCount := appConf.GetBool("enable_request_count", true)
		enableRequestCountDuration := appConf.GetBool("enable_request_duration", true)
		enableStatusCodeCount := appConf.GetBool("enable_status_code_count", true)

		// 创建一个新的NginxCollector实例，用于收集Nginx的指标
		logger.Infof("Nginx日志: %s %v", logFilePath, hosts)
		collector := nginx.NewNginxCollector(durationHours, enableRequestCount, enableRequestCountDuration, enableStatusCodeCount, hosts...)

		// 尝试创建一个新的FileWatcher实例，用于监控Nginx访问日志文件
		watcher, err := watcher.NewFileWatcher(logFilePath, saveOffset)
		if err != nil {
			return fmt.Errorf("创建文件观察器时出错: %v", err)
		}

		// 开始收集通过文件监控器传递的日志数据
		collector.Collect(watcher.Subscribe())

		// 创建一个新的Exporter实例,将收集器注册到Exporter中
		exporter := nginx.NewExporter()
		exporter.AddCollector(collector.Collectors()...)

		// 创建一个Prometheus HTTP处理器，用于暴露指标
		h := promhttp.HandlerFor(exporter.GetGatherers(),
			promhttp.HandlerOpts{
				ErrorLog:      logger,                   // 设置错误日志记录器
				ErrorHandling: promhttp.ContinueOnError, // 设置错误处理方式为继续处理
			})

		//应用关闭时清理资源
		exporterApp.OnClosing(func(a app.IAPPConf) error {
			watcher.Close()
			return nil
		})

		// 注册一个HTTP服务，用于暴露指标
		exporterApp.Micro("/metrics", func(ctx hydra.IContext) interface{} {
			h.ServeHTTP(ctx.Response().GetHTTPReponse(), ctx.Request().GetHTTPRequest())
			return nil
		})

		// 启动文件观察器
		watcher.Start()

		return nil
	})

}
